當同乙份**產生兩個例項(執行態)時,他們所操作的空間就是同一塊空間,這會造成資料不按預想地被修改,這就是重入問題,避免了這種衝突的**叫可重入**。
同乙個程序內,乙個函式還沒有執行完就又開始第二次呼叫,這也會引起重入問題。如正在執行add()函式,此時來了個中斷,中斷服務子程式中也要呼叫add()函式,此時可能會有風險。
保護範圍,細粒度即是保護得那段**很精簡
強調**的秩序,即誰先誰後
排他,資源性保護
最簡單粗暴無腦的做法,容易造成系統效能下降,一般不用,遮蔽了中斷的**要求快速執行,不能休眠,執行完馬上開啟中斷。
不可被打斷的操作叫做原子操作
asm/atomic.h
型別: atomic_t
初始化:atomic_t tv = atomic_init(初值);
/** 功能:讀取原子量的值
*/atomic_read(v)
/*
* 功能:設定原子量為某個值
*/atomic_set(v, i)
原始碼目錄下arch/tile/include/asm/ include/asm/atomic.h
/*
* 功能:將原子量加上某個值後返回
*/atomic_add_return(int i, atomic_t *v)
/*
* 功能:將原子量加1後返回
*/atomic64_inc_return(v)
/*
* 功能:將原子量減掉某個值並且判斷減後是否為0
* 返回值:減後為0則返回ture(1),否則返回fase(0)
*/ atomic64_sub_and_test(i, v)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct class *cls = null;
#include "mycmd.h"
static int major = 0;
static int minor = 0;
const int count = 6;
#define devname "demo"
static struct cdev *demop = null;
#define kmax 1024
static int counter = 0;
static char kbuf[kmax];
static atomic_t tv;
//開啟裝置
static int demo_open(struct inode *inode, struct file *filp)
memset(kbuf, 0, kmax);
counter = 0;
return0;}
//關閉裝置
static int demo_release(struct inode *inode, struct file *filp)
//讀裝置
//ssize_t read(int fd, void *buf, size_t count)
static ssize_t demo_read(struct file *filp, char __user *buf, size_t size, loff_t *offset)
if(copy_to_user(buf, kbuf, size))
counter = 0;//模擬已讀空
return size;
}//寫裝置
static ssize_t demo_write(struct file *filp, const char __user *buf, size_t size, loff_t *offset)
if(copy_from_user(kbuf, buf, size))
counter = size; //模擬成功寫入size個位元組
return counter;}/*
* read/write param
* read status
* contrl device
*/static long demo_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
, };
struct karg *usrarg;
switch(cmd)
usrarg = (struct karg *)arg;
if(copy_to_user(usrarg, &karg, sizeof(karg)))
printk(kern_info "cmdr: %s : %s : %d ---done.\n", __file__, __func__, __line__);
break;
case cmdw:
printk(kern_info "cmdw: %s : %s : %d\n", __file__, __func__, __line__);
if(_ioc_size(cmd) != sizeof(karg))
usrarg = (struct karg *)arg;
if(copy_from_user(&karg, usrarg, sizeof(karg)))
printk(kern_info "cmdw: %d : %s\n", karg.kval, karg.kbuf);
break;
default:;};
return0;}
static struct file_operations fops = ;
static int __init demo_init(void)
//2. init cdev obj
cdev_init(demop, &fops);
ret = alloc_chrdev_region(&devnum, minor, count, devname);
if(ret)
major = major(devnum);
//3. register cdev obj
ret = cdev_add(demop, devnum, count);
if(ret)
cls = class_create(this_module, devname);
if(is_err(cls))
for(i = minor; i < (count+minor); i++)
}// init atomic_t
atomic_set(&tv, 1); //原子變數初始化
//get command and pid
printk(kern_info "(%s:pid=%d), %s : %s : %d - ok.\n",
current->comm, current->pid, __file__, __func__, __line__);
return
0;err_step2:
for(--i; i >= minor; i--)
class_destroy(cls);
err_step1:
unregister_chrdev_region(devnum, count);
err_step:
cdev_del(demop);
//get command and pid
printk(kern_info "(%s:pid=%d), %s : %s : %d - fail.\n",
current->comm, current->pid, __file__, __func__, __line__);
return ret;
}static void __exit demo_exit(void)
class_destroy(cls);
unregister_chrdev_region(mkdev(major, minor), count);
cdev_del(demop);
}module_init(demo_init);
module_exit(demo_exit);
module_license("gpl");
module_author("farsight");
module_description("demo for kernel module");
第七課 js的DOM操作
這節課我們來學js的dom操作 先來說下啥事dom,就是document object model,文件物件模型 dom操作就是用來操作html裡的各個標籤的,看演示 這節課講dom操作 1 獲取html的某個標籤 根據標籤名 document.getelementsbytagname tagnam...
C語言第七課
主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...
第七課 C變數
第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...