ThreadStack

RT-thread线程创建:动态线程与静态线程

邮差的信 提交于 2021-02-19 06:55:35
本文介绍了如何创建一个动态线程和一个静态线程 RT-thread版本:RT-thread system 3.1.0 开发环境:MDK5 为了编程方便,创建了sample1.c文件,然后添加到工程中 话不多说,先上代码 #include " rtthread.h " #define stack_size 1024 //设置动态线程栈大小 #define priority 25 //设置优先级 #define tick 10 //时间片 static rt_thread_t tid1 = NULL; //指针初始化为NULL static void thread1_entry( void * parameter) //线程1入口函数 { rt_base_t i; rt_uint16_t count = 0 ; for (i = 0 ; i < 10 ; i++ ) { rt_kprintf( " thread1, count: %d\n " , count++ ); } } ALIGN(RT_ALIGN_SIZE); static struct rt_thread thread2; static char thread_stack[ 1024 ]; static void thread2_entry( void * parameter) //线程2入口代码 { rt_base_t i,

高并发学习笔记

▼魔方 西西 提交于 2020-10-28 11:44:58
并发 概念 高并发 并发: 多个线程操作相同的资源,保证线程安全,合理使用资源 高并发: 服务能同时处理很多请求,提高程序性能 java 内存模型 Thread Stack 存储基本 变量:比如 int , long 等,或者对象句柄 或者方法 本地变量存在 栈上即 Thread Stack , 对象存在 堆上即Heap 一个本地变量也可能指向一个 对象引用。即引用存储在栈上, 对象是 存在堆上, 一个对象的方法和本地变量是存储在 Thread stack 上的,就算该对象存在 Heap堆上, 一个对象的成员变量 可能会随着这个对象存在 堆上,不管这个成员变量是 原始类型还是引用类型, 静态成员变量,跟随类的定义一起存在堆上, 堆上对象可以被持有该对象引用的线程访问, 一个线程可以访问一个对象,也可以访问该对象的成员变量 如果两个线程 持有 同一个对象的引用,或者调用了同一个对象的方法,线程都会持有对象的成员变量, 但是这两个线程都拥有这个对象的成员变量的 私有拷贝(所以并发时候就容易造成数据不一致) CPU与 Java Memory Model 内存模型 CPU Registers 即 CPU 寄存器 Main Memory 即 主存 同步八种操作 同步规则 总结 并发测试工具 postman , Apache Bench https://www.cnblogs.com

【自制操作系统15】用户进程

喜你入骨 提交于 2020-08-15 08:30:25
一、到目前为止的程序流程图   为了让大家清楚目前的程序进度,画了到目前为止的程序流程图,如下。 二、CPU 原生支持多任务切换   没错,本来多任务同分页、中断、段选择子一样,都是软硬件配合的产物,CPU 厂商也在硬件层面用 TSS 结构支持多任务,同中断的逻辑一样,也是有个 TSS 描述符存在 GDT 全局描述符表里,有个 TR 寄存器存储 TSS 的初始内存地址,然后只需要用一个简单的 call 指令,后面地址指向的描述符是一个 TSS 描述符的时候,就会发生任务切换,一条指令,很方便。   但硬件其实也是通过 很多微指令 实现的任务切换,虽然程序员很方便用了一条指令就切换了任务,但实际上会产生一个很复杂很耗时的一些列操作,具体是啥我也没研究。   所以现在的操作系统几乎都没有用原生的方式实现多任务,而是用软件方式自己实现, 仅仅把 TSS 当作为 0 特权级的任务提供栈 ,不过那是因为硬件要求必须这么做,不然操作系统可能完全会忽视 TSS 的所有支持。比如 Linux 的做法就是, 一次性加载 TSS 到 TR ,之后不断修改同一个 TSS 的内容,不再进行重复加载操作。 Linux 在 TSS 中只初始化了 SS0、esp0 和 I/O 位图字段,除此之外 TSS 便没用了,就是个空架子,不再做保存任务状态之用。 三、为应付 CPU 实现 TSS 正如上文所说

【自制操作系统15】用户进程

可紊 提交于 2020-08-12 20:45:19
一、到目前为止的程序流程图   为了让大家清楚目前的程序进度,画了到目前为止的程序流程图,如下。 二、CPU 原生支持多任务切换   没错,本来多任务同分页、中断、段选择子一样,都是软硬件配合的产物,CPU 厂商也在硬件层面用 TSS 结构支持多任务,同中断的逻辑一样,也是有个 TSS 描述符存在 GDT 全局描述符表里,有个 TR 寄存器存储 TSS 的初始内存地址,然后只需要用一个简单的 call 指令,后面地址指向的描述符是一个 TSS 描述符的时候,就会发生任务切换,一条指令,很方便。   但硬件其实也是通过 很多微指令 实现的任务切换,虽然程序员很方便用了一条指令就切换了任务,但实际上会产生一个很复杂很耗时的一些列操作,具体是啥我也没研究。   所以现在的操作系统几乎都没有用原生的方式实现多任务,而是用软件方式自己实现, 仅仅把 TSS 当作为 0 特权级的任务提供栈 ,不过那是因为硬件要求必须这么做,不然操作系统可能完全会忽视 TSS 的所有支持。比如 Linux 的做法就是, 一次性加载 TSS 到 TR ,之后不断修改同一个 TSS 的内容,不再进行重复加载操作。 Linux 在 TSS 中只初始化了 SS0、esp0 和 I/O 位图字段,除此之外 TSS 便没用了,就是个空架子,不再做保存任务状态之用。 三、为应付 CPU 实现 TSS 正如上文所说

[apue] 一个快速确定新系统上各类限制值的工具

北慕城南 提交于 2020-08-08 07:13:44
对于在不同 Unix 系统之间移植程序,最重要的事情就是确定新系统的一些编译时、运行时固定或不固定的限制值了。例如文件路径最大长度 PATH_MAX、进程最大可打开文件句柄数 OPEN_MAX、用户可加入的附加用户组最大数量 NGROUPS_MAX、进程命令行参数最大字节数 ARG_MAX、内存页大小 PAGESIZE、线程栈大小默认值 STACKSIZE、临时文件最大数量 TMP_MAX 等等。甚至有些系统特征也可以通过查询来提前确定,例如是否支持读写锁、是否支持异步 IO、是否支持实时信号等等,这样程序就可以根据系统提供的能力来选择不同的接口去实现同样的功能。 回头来看 apue 第二章有关系统限制与选项这一块的内容,由于掺杂了 UNIX 标准化的内容,显得很没有条理,例如将各种限制按标准划分为: ISO C 编译时限制 (头文件常量) POSIX 不变的最小值 (声明遵循 POSIX 的系统必需支持到至少这么多,不能再小了) 不变值 (SSIZE_MAX) 运行时可增加的值 运行时不变的值 路径名可变值 XSI 不变的最小值 (同上) 数值限制 运行时不变值 看得人一头雾水,其实如果抛开标准,单按限制的性质来分,就比较简单啦: 编译时限制 (通过头文件常量) 运行时限制 不与文件系统相关部分(通过 sysconf) 与文件系统相关部分(通过 pathconf) 也就是说

【JAVA】启动一个最简单的Java main程序时有多少个线程被创建

你。 提交于 2019-12-14 18:24:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>  在java中,启动一个简单的main程序,并不是只是单单创建了一个main线程而已,JVM会自动创建一些辅助用的线程,主要有以下几个:   Attach Listener:Attach Listener线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反 馈信 息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。   Signal Dispatcher:前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。   Finalizer:这个线程也是在main线程之后创建的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;   Reference Handler:VM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用

启动一个最简单的Java main程序时有多少个线程被创建

天大地大妈咪最大 提交于 2019-11-29 18:37:50
 在java中,启动一个简单的main程序,并不是只是单单创建了一个main线程而已,JVM会自动创建一些辅助用的线程,主要有以下几个:   Attach Listener:Attach Listener线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反 馈信 息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。   Signal Dispatcher:前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。   Finalizer:这个线程也是在main线程之后创建的,其优先级为10,主要用于在垃圾收集前,调用对象的finalize()方法;   Reference Handler:VM在创建main线程后就创建Reference Handler线程,其优先级最高,为10,它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。 以上这部分内容引用自 http://ifeve.com