进程理论与编程

来源:互联网 发布:linux物理网卡 编辑:程序博客网 时间:2024/04/29 08:59

 

进程和程序区别:进程可以看成运行起来的程序,具有动态,并发,独立,异步性。

具有三态:就绪,执行,诸塞

 

进程互斥:若干进程使用共享资源时,最多只允许一个进程使用。

进程同步:并发进程按一定顺序执行的过程称为进程间的同步。

进程调度:按一定算法,从一组待运行的进程中选出一个来占有CPU运行。调度方式:抢占和非抢占

调度算法:先来先服务;短进程先调度;优先级调度;时间片轮寻。

临界资源:同一时刻允许一个进程访问的资源。进行中访问临界资源的那段代码叫做临界区。

 

获取ID

Pid_t Getpid(void);

创建进程 fork/vfork

Pid_t fork(void);

 

Pid_t vfork(void);

区别:

Fork子进程拷贝父进程的数据段

Vfork  共享数据段

 

Fork 运行顺序不确定

Vfork 子进程先运行

 

Exec用被执行的程序替换调用它的程序 ,PID不会改变。

Int execl(const char *path,const char *arg1,......);

Path:被执行的程序名 

Arg:   参数

例如

Execl(/bin/ls,ls,-al,/etc/passwd,(char *)0);

 

进程等待

Pid_t wait(int *status)

例如Wait(NULL);

阻塞改进程,直到其某个子进程退出。

 

进程通信原因:

数据传输,资源共享,通知事件,进程控制。

进程通信(IPC)由下几部分继承来:

Unix进程通信,POSIX 可移植操作系统接口,system V进程通信。

linux通信方式:

管道pipe和有名管道fifo,信号(signal),消息队列,共享内存,信号量,套接字。

 

信号通信

 

信号发送 按键,函数或命令

 

Int kill(pid_t pid,int signo);//可给其他进程发信号

Int raise(int signo);//给自己发信号

Int alarm(int seconds);//设置时间到了产生sigalarm信号

Int pausevoid//挂起 直到捕捉到一个信号

 

信号处理

两种方法:一种是signal函数,另一种是信号集函数组。

Void(*signalint signo ,void (*fun)(int)))(int) typedef void (*sighandler_t)(int) sighandler_t signal(int signum ,sighandler_t handler))

例如

 

Void my_func()

{

Printf(hahahaha \n);

}

Main()

{

Signal(SIGINT,my_func);

 

Pause();

Exit(0);

}

Handler可能的值:sig_ign忽略,sig_dfl,信号处理函数名。

 

共享内存

是多个进程共享一部分物理内存。

实现分两个步骤:

使用shmget函数0创建共享内存;

Shmat函数映射共享内存。

Int shmget(key_t keyint size, int shmflg);

Key:标识共享内存的键值:0IPC_PRIVATEkeyIPC_PRIVATE时创建一块新的共享内存;key0,shmflgIPC_PRIVATE时也创建一块新的共享内存。

 

Int shmat(int shmid,char *shmaddr,int flag)

Shmid shmget函数返回的共享内存存储标示符

Shmaddr:为表示自动分配地址

Flag:什么方式确定映射的地址

 

消息队列

Struct msg_buf

{

Int mtype;

Char data[255];

}

Key=Ftok(/tem/2 ,a );//吧消息队列文件名转换为键值

Msgid=Msgget(key,IPC_CREAT|0666);//利用键值打开消息队列

 

Struct msg_buf msgbuf;

Msgbuf.mtype=getpid();

Ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAT);发送

 

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),IPC_NOWAIT );接收

 

信号量

用途是来保护临界资源。进程可根据它判断是否能够访问某些共享资源。

分类:

二值信号量,只能去0/1

计数信号量,可以取任意值

 

Int semget(key_t key,int nsems,int semflg);创建信号量集合

Key键值

Nsems多少个信号量

Semflg标识 IPC_NOWAIT IPC_END

 

Int semop(int semid, struct sembuf *sops, unsigned nsops); 对信号量的控制

Semid 信号量集的ID

Sops 操作数组,表明进行什么操作

Nsops 指向数组的元素个数

原创粉丝点击