信号量

信号量的创建和删除

你。 提交于 2019-11-30 10:57:37
1. 创建信号量,并利用ipcs -s查看信号量: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <stdio.h> #include <stdlib.h> int main(void) { int semid; int nsems = 1;//semaphores nums to create int flags = 0666; //world read-alter mode struct sembuf buf; //how semop should behave //create the semaphore with world read-alter perms semid = semget(IPC_PRIVATE, nsems, flags); if(semid < 0) { perror("semget"); exit(EXIT_FAILURE); } printf("semaphore created: %d\n", semid); //set up the structure for semop buf.sem_num = 0; //A single semaphore buf.sem_flg = IPC_NOWAIT; //don't block if((semop

IPC 三种通信机制

我们两清 提交于 2019-11-30 10:56:44
最近看了,IPC三种通信机制,OK,小写自己的收获吧。 IPC三种通信机制是指:信号量、共享内存、消息队列,一开始看得时候感觉有点吃力,当我模仿书上的程序写了写代码之后,就慢慢的理解了。 信号量:通过操作系统中的PV操作来实现; 共享内存:申请一块内存,进程A往共享内存中写,其他的进程就可以通过读出共享内存中的内容来获取进程A所传送的信息; 消息队列:创建一个消息队列,进程A往队列里面写,那么进程B通过读队列中的容来获取进程A传送的信息。 具体的实现其实就是用三组函数来实现的,而且形式都是很有相似性的。 信号量: #include<sys/sem.h> int semget(key_t key,int num_sems,int sem_flgs); int semctl(int sem_id,int sem_num,int command...); int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops); 每个函数的功能和参数的意义在手册中都能找到。 1、semget 创建一个信号量或者获取一个已知信号量的键 key:不相关的进程可以通过他来访问同一个信号量 num_sems:需要的信号量数目。几乎总是1 sem_flags:一组标志,例如IPC_CREAT; 返回值是信号量标志符,给其他信号量函数使用 2

多进程

大憨熊 提交于 2019-11-30 09:28:17
#include <iostream> #include <stdio.h> #include <windows.h> #include<fstream> //ifstream using namespace std; HANDLE Empty, Full, Mutex; //声明3个信号量,mutex为互斥信号量,剩下的为同步信号量,同事同步信号量也起到计数器的作用 句柄类型 int x = 0; int y = 0; ofstream outf; DWORD WINAPI produce(LPVOID param) { int j = 0; do { WaitForSingleObject(Empty, INFINITE);//P(Empty) WaitForSingleObject(Mutex, INFINITE);//P(Mutex),形成互斥,生产者、消费者,生产者、生产者;只能一个人占用这个资源 //cout << "produce, "; printf("produce,\n"); outf<<"produce,\n"; j++; ReleaseSemaphore(Mutex, 1, NULL);//V(Mutex),取消互斥,允许其他线程生产,占用此互斥资源 ReleaseSemaphore(Full, 1, NULL);//V(Full),放一个物品到货架

操作系统第二章(二)

你说的曾经没有我的故事 提交于 2019-11-30 08:46:46
2.4 进程的互斥 1.互斥的定义:对某个系统资源,一个进程正在使用它,另外一个想用它的进程就必须等待,而不能同时使用 。 2.临界区:进程中访问临界资源的那段程序代码称为临界区或临界段。使用同一临界资源的不同进程中的临界区称为同类临界区或相关临界区。 3.临界区使用原则:每次至多有一个进程处于临界区; 当有若干个进程欲进入临界区时,应在有限的时间内使其进入; 进程在临界区内仅逗留有限的时间。 空则让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。 忙则等待:不允许两个以上的进程同时进入互斥区。 多中择一:当没有进程在临界区,而同时有多个进程要求进入临界区,只能让其中之一进入临界区,其他进程必须等待。 等则有限:任何进入互斥区的要求应在有限时间内得到满足。 等则让权:当进程不能进入临界区时,应立即释放CPU,避免进程忙等待。 4.用上锁和开锁原语可以解决并发进程的互斥 (1)任何欲进入临界区的进程,必须先执行上锁原语。若上锁原语顺利通过,则进程可进入临界区;当完成对临界区资源的访问后再执行开锁原语,以释放该临界资源。 (2)即在相关进程的程序里由上锁和开锁原语紧夹着临界区,就能保证这些进程互斥地进入各自的临界区。 例如: 但是这种情况会使得CPU忙等,浪费了资源。 2.5信号量机制 1.信号量原理 两个或多个进程可以利用彼此间收发的简单的信号来实现“正确的”并发执行

Linux进程间的通信方式

感情迁移 提交于 2019-11-30 06:58:19
管道 管道是Linux支持的最草的IPC(进程间通信)方式,可以分为有名管道和无名管道 无名管道 1. 管道是半双工,只能支持单向流动,两个进程需要建立两个通道来进行通信 2. 无名管道通过pipe()函数创建,只能用于父子进程或者兄弟进程之间 3. 一个进程向管道中写数据,加入到管道缓冲区的尾部,另一个进程读的时候从缓冲区的头部读取 有名管道 有名管道也是半双工,但是它允许任何两个进程之间的通信,有名管道提供一个路径名与之进行关联,以FIFO的方式存在于文件系统中 信号量 提到信号量,就能想到P/V操作,也就是wait()和sinal()操作。信号量是一种计数器,可以控制进程间多个线程或者多个进程之间对共享资源的访问,实现为一种锁的机制。 信号 操作系统可以根据信号的不同来进行不同的处理方式,采用默认的处理方式,即进程中断或退出 ,也可以采用另一种机制,即忽略该信号,另外的就是自定义处理函数,执行相应的操作 消息队列 消息队列是一种链表的形式,允许一个或这多个进程来写数据,一个或多个进程进行读数据, 共享内存 共享内存映射为一段可以被其他进程访问的内存。该内存被一个进程所创建,然后其他进程可以挂载到该共享内存中。,共享内存是最快的进程间通信方式,但是不支持并发控制,所以通常配合信号量机制实现进程间的通信 socket socket也是一种进程间的通信方式

操作系统常见笔试面试题

♀尐吖头ヾ 提交于 2019-11-30 05:51:49
操作系统常见笔试面试题 Yuanke_S 2019年06月04日 50 0 本博客内容 一、进程与线程的关系以及区别 二、Windows下的内存是如何管理的 三、中断和轮询的特点 四、什么是临界区、如何解决冲突? 五、分段和分页的区别? 六、进程间通信有哪些方式?它们的区别? 七、线程间的通信机制 八、什么是死锁?产生条件?如何避免死锁 九、进程间同步与互斥的区别,线程同步的方式? 十、进程的调度算法有哪些? 一、进程与线程的关系以及区别 参考: https://blog.csdn.net/yaosiming2011/article/details/44280797 https://www.cnblogs.com/xymqx/p/4442329.html 1.定义:   进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.   线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系:   一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.   相对进程而言,线程是一个更加接近于执行体的概念

信号量

穿精又带淫゛_ 提交于 2019-11-30 04:23:45
'''一 信号量信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小'''from threading import Thread, Semaphoreimport threadingimport timedef fun(): sm.acquire() print('%s is la'%threading.current_thread().getName) time.sleep(3) sm.release()if __name__ == '__main__': for i in range(50): sm = Semaphore(5) t = Thread(target=fun) t.start() '''解析Semaphore管理一个内置的计数器,每当调用acquire()时内置计数器-1;调用release() 时内置计数器+1;计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。''' 来源: https://www.cnblogs.com/yuexijun/p

面试问题之操作系统:信号量与互斥锁之间的区别

蓝咒 提交于 2019-11-30 04:21:30
互斥量用于线程的互斥,信号量用于线程的同步。 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 互斥 :是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步 :是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 来源: https://www.cnblogs.com/yichengming/p/11559274.html

MFC多线程编程之四——线程的同步

柔情痞子 提交于 2019-11-30 04:18:01
八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种: 临界区(CCriticalSection) 事件(CEvent) 互斥量(CMutex) 信号量(CSemaphore) 通过这些类,我们可以比较容易地做到线程同步。 A、使用 CCriticalSection 类 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 定义CCriticalSection类的一个全局对象

JAVA中线程到底起到什么作用!

假如想象 提交于 2019-11-30 03:37:09
这是javaeye上非常经典的关于线程的帖子,写的非常通俗易懂的,适合任何读计算机的同学. 线程同步 我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。 线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。 当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。 同步这个词是从英文synchronize(使同时发生)翻译过来的。我也不明白为什么要用这个很容易引起误解的词。既然大家都这么用,咱们也就只好这么将就。 线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。 因此,关于线程同步,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。这可真是个无聊的绕口令。 关于线程同步,需要牢牢记住的第二点是 “共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。 关于线程同步,需要牢牢记住的第三点是,只有“变量”才需要同步访问。如果共享的资源是固定不变的,那么就相当于“常量”