首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python 学习笔记day10-pyt

fork工作原理         什么是forking             fork(分岔)在linux系统中使用非常广泛             当某一命令执行时,父进程(当前进程)fork...0,则打印hello from child,因hello from both为全局代码所以也打印出来             因为所有的父子进程拥有相同的资源,所以在编写程序时要避免资源冲突 #!...、二进制(或其它类型)的数据             进程(有时被称为重量级进程)是程序的一次执行             每个进程都有自己的地址空间,内存以及其它记录其运行轨迹的辅助数据             ...不同的是,所有的线程运行在同一个进程中,共享相同的运行环境             线程有开始,顺序执行结束三部分             线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行...,这叫做让步             一个进程中的各个线程之间共享同一片数据空间,所以线程之间可以比进程之间更方便的共享数据以及相互通讯             线程一般都是并发执行的,正是由于这种并行和数据共享机制使得多个任务的合作变为可能

79830

详解Linux的系统调用fork()函数

由于新的进程是从原来的进程所复制而来的,因此新进程会继承原来进程的所有资源信息,包括内存、文件描述符、信号处理方式等。 需要注意的是,fork()函数并不保证父进程子进程的执行顺序。...在fork()之后,操作系统可能会先执行父进程,也可能会先执行子进程,这完全取决于系统的调度算法。...一般情况下,父进程子进程之间是相互独立的,它们各自运行各自的代码,共享的只有一部分内存空间,而其他资源则是分别使用的。...L0、L1L2并创建三个子进程,四个进程再打印出四个Bye ⑦ Nested forks in children void fork5() { printf("L0\n"); if...L0,子进程打印出L1,子进程创建的子进程打印出L2并创建一个子进程,四个进程打印四个Bye

74430
您找到你想要的搜索结果了吗?
是的
没有找到

C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值地址 )

文章目录 一、验证二维数组内存是线性的 1、打印二维数组 2、以一维数组方式打印二维数组 3、打印二维数组值地址 二、完整代码示例 一、验证二维数组内存是线性的 ---- 验证二维数组内存是线性的...array as one-dimensional array : 0 : 0 1 : 1 2 : 2 3 : 3 4 : 4 5 : 5 3、打印二维数组值地址 打印二维数组的元素地址 , 其地址是连续的...; =/** * @brief print_array 打印二维数组的值地址 * @param array */ void print_array3(int array[][3]) {...0; i < 6; i ++) { printf("%d : %d\n", i, array[i]); } } /** * @brief print_array 打印二维数组的值地址...print_array(array); // 使用一维数组的方式打印二维数组的值 print_array2(array); // 打印二维数组的值地址

2.4K20

C++】C++11 线程库

如果存在未指向完毕的从线程,主线程就会阻塞在 join 语句处等待从线程,直到所有从线程都执行完毕 – void join()。...,只有 main thread 语句是确定最后打印的,因为这条语句打印前需要等待其他从线程执行完毕。...C++11 mutex 类 为了解决上面的线程安全问题,C++11 提供了 mutex 类;mutex 是一个可锁定的对象,用于在代码的关键部分需要独占访问时发出信号,防止具有相同保护的其他线程同时执行并访问相同的内存位置...CAS 操作包含三个操作数 – 内存位置(V)、预期原值(A)新值 (B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则处理器不做任何操作。...这样做的优点是即实现了语言层面上 ++ 操作的原子性,解决了其线程安全问题;缺点是有一些 ++ 操作可能要重复执行多次才能成功,一定程度上影响程序效率,但还是比加锁解锁的效率要高。

36340

硬件与编程语言的内存模型

此前在文章《Go并发迷思:消失的赋值语句》简要地介绍过Go的内存模型,也欢迎读者阅读。...在执行给定程序时,硬件编译后的代码究竟是如何执行的,主要受内存中数据更改的可见性一致性影响,而规定内存数据可见性一致性的被称为“内存一致性模型”(memory consistency model)...被禁止的优化另外,Go定义了哪些优化是禁止进行的(但在C++编译器中允许的),例如包括如下几条。反转条件即,不移动条件语句的读写。...f()i := *p*q = 1// 不能被优化为i := *p*q = 1f()单次读不能观测多次值即,不能从共享内存多次读取一个值。...这里,假设变量值来自共享内存,但执行过程中因为寄存器数量有限不得不覆盖该变量所占用的寄存器,则Go需要把该变量保存到栈中,而不是像C++一样后续使用时再次读取该值。

38750

易错易忘点

,也可不加 2、打印一个值,输出无括号 3、打印多个值,若打印时加了括号,输出也有括号,并且有逗号分隔,即元组形式 4、打印多个值,若打印时没加括号,输出也没括号,并且没有逗号分隔...,与python3一致 5、python3中,打印时必须要加括号 3、input 1、python2中有两种打印语句:inputrawinput 2、python2中input...、进程池设定最大线程、进程数量 使用互斥锁保证数据安全,即数据完整和数据同步 4、GIL 1、全局解释器锁,本质是线程互斥锁 2、每个进程内都有一把 3、由于进程内线程共享全局资源,为了保证共享数据的完整性状态同步...3**:重定向 4**:客户端错误,如404请求资源不存在,403当前不符合某一些条件,拒绝访问 5**:服务器内部错误 7、垃圾回收机制 存储机制: 栈区:存储变量名变量值内存地址关联关系...,都需要把所有对象的引用计数都遍历一遍,非常耗时 分代:指的是根据变量在多次扫描后,都没有被回收的变量,gc机制将其扫描频率降低,这样多次分级之后,大大减少了遍历的变量个数,节省了时间

1.1K20

volatile关键字到底有什么作用

Java内存模型以及共享变量的可见性 JMM决定一个线程对共享变量的写入何时对另一个线程可见,JMM定义了线程内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存...,并在“返回结果”后停止(未打印),而转为线程B执行操作,巧合的是线程B这三步操作在一个时间片中完成:读取数据、计算数据、返回结果、打印数据,然后时间片转回线程A,线程打印刚刚计算的数据,此时就会发生先打印的数据比后打印的数据大的问题...,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行; 在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。...通俗的说就是执行到volatile变量时,其前面的所有语句执行完,后面所有语句都未执行。且前面语句的结果对volatile变量及其后面语句可见。...当线程A在执行第5行代码时,B线程进来执行到第2行代码。假设此时A执行的过程中发生了指令重排序,即先执行了ac,没有执行b。

38120

一文搞懂Go语言内存模型

Go语言的内存模型主要定义了如何在并发环境下安全地读写共享数据。它确保了并发执行的goroutines(Go语言的轻量级线程)之间对共享变量的访问操作的正确性一致性。...总的来说,Go语言的内存模型通过定义happens-before关系、使用通道同步原语以及禁止数据竞争等方式,确保了并发执行的goroutines之间对共享数据的正确访问操作。...Go 程序执行被建模为一组 goroutine 执行,以及一个映射 W,该映射指定每个类似读取操作从中读取的类似写操作。(同一程序的多次执行可以具有不同的程序执行。)...此程序(如上所述,但交换了发送接收语句并使用无缓冲channel):var c = make(chan int)var a stringfunc f() {a = "hello, world"<-c}...如果通道是缓冲的(例如,c = make(chan int, 1)),则无法保证程序打印"hello, world"。 (它可能会打印空字符串、崩溃或执行其他操作。)

18810

linux 小结

linux 基本命令 目录操作 mkdir 创建文件夹 mkdir -p 递归创建目录 创建多个目录 mkdir [-p] a b c touch a b c 创建文件 rm -r 递归 -f 强制删除...出有关键字的日志并输出后10行 tail -f -n200 test.log|grep '出账' -A10 其他 killall ifconfig netstat -tnlp net状态 top 后 M 内存排序...,那么我才执行命令2) -f 表示是否是文件, -d 表示是否是目录,-x表示是否可执行 循环条件分支 if [ 条件 ] then 指令 fi if [ 条件 ] then 指令1 else...值n) 指令n ;; esac for 值 in 列表 do 执行语句 done while 条件 do 执行语句 done continue 跳出当前循环...Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 Type=oneshot:一次性进程

1.3K10

python 进程间通信(四) -- 共享内存与服务器进程

并发环境下的数据共享 通常,在并发环境下应该尽量避免数据状态的共享,因为这意味着竞争条件的产生,而进程间的同步就意味着效率的降低以及更高的复杂度。...double 类型的数字一个 int 型数组,最终打印出被子进程修改的最终值: 3.1415927 [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] 3.3.2....理论上, 数字是不会被加到 11 以上的,但是实际打印出的数字却是 12,且多次执行结果会出现不同,这是为什么呢?...假设共享内存中数字为 10,多个进程同时判断该共享内存中的数字是否不大于 10 均返回 True,于是他们都对共享内存中的数字进行加 1 操作,就出现了实际执行 +1 的次数超过了预期次数。...BoundedSemaphore Condition Event Barrier Queue Value Array 一旦创建,对象的使用与原生类型的用法是完全相同的,因此相比于共享内存,服务器进程的使用更为简单灵活

4.3K20

Python面向对象魔法方法单例模块代码实例

即:设置(添加/修改)属性会触发它的执行; __del__: 当对象在内存中被释放时,自动触发执行,该方法会在最后执行。...,都会触发__delattr__的执行 __str__: 会在打印对象时触发。...__class__ # 输出 lib.aa.C,即:输出类 __enter____exit__ 我们知道在操作文件对象的时候可以这么写 with open(‘a.txt’) as f:   ...’代码块’ 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter____exit__方法 class Open: def __init...,有返回值则赋值给as声明的变量 ===== 执行代码块 with中代码块执行完毕时执行我啊 ''' exit()中的三个参数分别代表异常类型,异常值追溯信息,with语句中代码块出现异常,则with

57100

《UNIX环境高级编程》第七章进程环境

下面三种情况进程终止状态是未定义的: a.调用这写函数时不带终止状态 b.main函数执行了一个无返回值的return语句 c.main没有声明返回类型为整型 特殊情况:若main的返回类型是整型,并且...main执行到最后一条语句时返回,那么进程是终止状态是0. 2.atexit函数 这个函数可以用来登记函数进给进程。...按照ISO C的规定,一个进程可以登记多至32个函数。先登记的后调用,同一函数登记多次则会被调用多次。...7.7 共享共享库使得可执行文件中不再需要包含公用的库函数,而只需要在所有进程都可引用的存储区中保存这种库例程的一个副本。...静态变量,程序在启动的时候,便为该变量分配了内存空间,程序中用externstatic关键标志,程序一开始执行的时候就已经存在了,但是不等于它们在整个程序中可用。 动态变量,也叫自动存储变量。

48510

计算机小白的成长历程——函数(4)

这里我们要拓展一个知识点——内存 内存 计算机的内存就好比与一个空间,它里面有三个分区,分别是栈区、堆区和静态区。...; unsigned int c = b % 100;//通过取模,我们将34给取出来存放进无符号整型局部变量c中进行打印; printf("%d\n", c / 10);//通过除号,我们将3给取出来进行打印...;;) { } do { } while; 在这个三个循环中选取一个即可; (4)既然要能重复,那说明执行语句是可以反复执行的,如果按我们之前编写的来做的话肯定不行,那我们就要开始寻找这四次之间的联系第一次...细心的朋友会发现,此时的yn与进入第二层函数时的yn一模一样,我们再仔细的观察一下函数体,会发现,每次进入print函数时,在进入if语句后,函数都会先给y进行赋值,问题就出现在这里,下面我们对代码进行一下调整...从这里我们可以得到结论: (1)执行语句在递归条件判断函数体内,则跟着递归函数一同顺序执行; (2)执行语句不在递归条件判断函数体外,则从递归停止后开始由内到外依次逆序执行

13340

PostgreSQL内存上下文

PostgreSQL内存上下文 PG使用共享内存在多进程之间进行数据共享。...使用动态共享内存段dynamic shared memory segments在并行workers之间进行数据交换,这个内存在启动时分配固定大小。但是PG后端进程必须管理私有内存用于处理SQL语句。...这对于编写服务器代码的人来说很有意思,但我要重点关注用户如何理解调试SQL语句内存消耗。 1.什么是内存上下文 PG由C语言编写,C语言的内存管理比较棘手,必须显式释放所有动态分配的内存。...1、单个语句可能有很多内存密集型执行步骤,因此会分配work_mem多次; 2、如果语句使用并行查询,会创建动态共享内存段,work_mem并不统计这个; 3、PG13之前,bytea二进制数据或者大PostGIS...执行有问题的语句,一旦执行到断点,就会触发内存上下文的dump: Breakpoint 1, ExecutorEnd (queryDesc=0x2333fd8) at execMain.c:471 471

27820

Linux应用开发【第四章】Linux进程间通信应用开发

调试的过程实际上就是程序的执行,就是本次程序功能的体现,因此这个时候它就是一个进程)。 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包含多个程序。...3.子进程判断process_inter为1则执行后面的打印语句,否则不执行。...59 shmdt(p); 60 61 memcpy(p, "abcd", 4); //执行这个语句会出现segment fault,因为解除了共享内存地址映射 62...运行 我们需要在4th_shm.c所在的同级目录下创建一个文件a.c(在jz2440开发板上) touch a.c 运行,此时会提示用户输入信息,输入完之后,执行第61行语句会出现Segmentation...此时会提示用户输入信息,第一次执行第42行语句时,读者可以看到共享内存,第二次执行第66行语句时,读者就看不到共享内存了,因为此时共享内存已经被删除了。

3.8K51

Java底层-01-Java内存模型

这种被多个线程访问的变量为共享变量。 2.3 Java内存模型计算机内存模型的关系 通常情况下,当一个cpu需要读取主存的时候它会将主存的部分读取到cpu缓存中。...语句1是直接将数值10赋值给x,也就是说线程执行这个语句会直接将数值10写入到工作内存中。...3.4 Happen-Before 规则 程序顺序原则:一个线程内保证语义的串行性(按书写次序顺序执行) 锁规则:解锁必然发生在随后的加锁前 传递性:A 先于 B ,B 先于 C,那么 A 必然先于 C...--编译器在不改变单线程程序语义的情况下,可以重新安排语句执行顺序 2、指令级并行的重排序--如果不存在数据依赖,处理器可以改变语句对应机器执行语句顺序 3、内存系统的重排序--由于处理器使用缓存读...6、一个变量在同一时刻只允许一条线程对其进行locd操作,但lock操作可以被同一条线程重复执行多次多次执行load后,只有执行相同次数的unlock操作,变量才会被解锁。

46610

Python变量及常量解释说明

,数字,"_"的组合,切不能以数字开头. ...a = 1  #变量a是一个整数 b = "shuai" #变量b是一个字符串 c = True #变量c是一个布尔值True (2)在python中,等号"="是赋值语句,可以把任意数据类型赋值给变量...变量在内存中的表示  当在写变量  name  = "zhang" 时,python解释器干了两件事情: (1)在内存中创建了一个'zhang'的字符串; (2)在内存中创建了一个名为'name'的变量...执行name = "zhang",解释器创建了字符串"zhang"变量"name",并把"name"指向"zhang"   执行name2 = name,解释器创建了变量"name2",并把name2...指向name指向的字符串"zhang":   执行name = "shuai",解释器创建字符串"shuai",并把name的指向改为"shuai",但name2并没有更改:  所以,最后打印变量name2

54720

1.自定义模块

这里一定要给同学强调那个文件执行文件,哪个文件是被执行模块。 ​...模块可以包含可执行语句函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次...,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 import...m1.py,打印“正在导入m1”,执行from m2 import y ,导入m2进而执行m2.py内部代码--->打印"正在导入m2",执行from m1 import x,此时m1是第一次被导入,执行...使用C编写的共享扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降

49530
领券