HUST OS 4.6 Windows和Linux进程同步机制【自学笔记】

版权声明:学习,哪有那么多条条框框~ https://blog.csdn.net/Irish_Moonshine/article/details/91128320

4.6 windows|Linux进程同步机制

4.6.1 临界区机制(CRITICAL_SECTION)
  • 等待函数WaitForXXXobject;(XXX:Multiple|Single)
    等待目标对象变成有信号的状态就返回

当多个线程同时在临界区就绪的时候,需要对临界区进行一个互斥的访问.

P(S) //进入临界区
V(S) //退出临界区

  • 互斥量 Handle

  • 信号量 Semaphore
    允许多个线程|进程访问临界区(通过初始化确定)
    一种资源计数器,用于限制并发线程的数量

信号量的值可以增减,Wait使其减;Release使其加;

值大于0表示有信号状态,反之无

4.6.2 Linux父子进程的同步

进程调用wait(int status)阻塞自己
阻塞到有子进程结束:Wait收集该子进程信息并彻底销毁它;

status保存进程退出时的状态;
变为僵尸状态,保留部分PCB信息供wait收集
1.正常结束还是异常结束
2.占用总系统cpu时间
3.缺页中断次数
调用schedule()函数,选择新进程远行

sleep(int nSecond) 休眠函数
1.进程暂停执行nSecond秒
2.系统暂停调度该进程
3.相当于windows的suspend(),挂起若干秒

新名词:fork(函数)
复刻|派生|分支

pit_t fork(void);(#include<sys/types.h)

返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回自己成ID;否则,出错返回-1;

扫描二维码关注公众号,回复: 6498545 查看本文章

fork()函数创造的新进程被称为子进程.

fork()函数会返回两次的原因:
由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回.
fork()Linux系统中的返回值是没有NULL的.
代码如下:

pid_t pid=fork();
if(pid==0){ //子进程
	exit(0);
}
else{ //父进程
	exit(0);
}

实验:父子进程共享普通变量,子进程对于这个变量i的修改,并不能影响其父进程

实验:父子进程共享文件资源,父子进程共享同一个文件和读写指针.修改都会记录而不会覆盖.

猜你喜欢

转载自blog.csdn.net/Irish_Moonshine/article/details/91128320
4.6