TSK

c++11 多线程入门教程(一)

二次信任 提交于 2021-02-09 03:39:50
  原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10945309.html      本网络编程入门系列博客是连载学习的,有兴趣的可以看我博客其他篇。。。。 c++ 网络编程课设入门超详细教程 ---目录        最近在找c++服务端开发的实习(大佬们有推荐吗QAQ。。),恰好写了一些c++11多线程有关的东西,就写一下笔记留着以后自己忘记回来看吧,也不是专门写给读者看的,我就想到哪就写到哪吧   c++11呢,就是c++升级之后的一个版本,现在马上就出c++20了,里面增加了很多对多线程支持的类,让多线程编程更加简单了,好了废话不多说,先来建立一个简单的多线程编程案例,看看c++11下多线程编程创建到底有多么的简单。 1.创建一个简单的多线程案例: 首先导入#include<thread>---用于创建线程 其次导入#include<chrono>--用于时间延时 获取时间之类的 定义一个线程对象t1,这就自动创建了一个线程,参数就是你要线程去执行的函数,t1是变量名字 随便取 std::thread t1(func); 下面这里返回一个毫秒级别的时间间隔参数值,间隔10毫秒 std::chrono::milliseconds(10) this_thread::sleep_for()就是让此线程休眠

鸿蒙内核源码分析(事件控制篇) | 任务间一对多和多对多的同步方案 | 中文注解HarmonyOS源码 | v30.01

人盡茶涼 提交于 2021-02-08 17:42:28
百万汉字注解 >> 精读内核源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新 < Gitee | Github | CSDN | Coding > 百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,多站点每日同步更新 < OSCHINA | CSDN | WeHarmony > 本篇说清楚事件(Event) 读本篇之前建议先读 鸿蒙内核源码分析(总目录) 其他篇. 官方概述 先看官方对事件的描述. 事件(Event)是一种任务间通信的机制,可用于任务间的同步。 多任务环境下,任务之间往往需要同步操作,一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型:一个任务等待多个事件的触发。可以是任意一个事件发生时唤醒任务处理事件,也可以是几个事件都发生后才唤醒任务处理事件。 多对多同步模型:多个任务等待多个事件的触发。 鸿蒙提供的事件具有如下特点: 任务通过创建事件控制块来触发事件或等待事件。 事件间相互独立,内部实现为一个32位无符号整型,每一位标识一种事件类型。第25位不可用,因此最多可支持31种事件类型。 事件仅用于任务间的同步,不提供数据传输功能。 多次向事件控制块写入同一事件类型,在被清零前等效于只写入一次。 多个任务可以对同一事件进行读写操作。 支持事件读写超时机制。 再看事件图 注意图中提到了三个概念

Windows XP操作系统进程

谁都会走 提交于 2021-01-01 06:38:29
1. 基本系统进程 Csrss.exe :这是子系统服务器进程,负责控制Windows创建或删除线程以及16位的虚拟DOS环境。   System Idle Process:这个进程是作为单线程运行在每个处理器上,并在系统不处理其它线程的时候分派处理器的时间。   Smss.exe:这是一个会话管理子系统,负责启动用户会话。   Services.exe:系统服务的管理工具。   Lsass.exe:本地的安全授权服务。   Explorer.exe:资源管理器。   Spoolsv.exe:管理缓冲区中的打印和传真作业。   Svchost.exe:这个进程要着重说明一下,有不少朋友都有这种错觉:若是在“任务管理器”中看到多个Svchost.exe在运行,就觉得是有病毒了。其实并不一定,系统启动的时候,Svchost.exe将检查注册表中的位置来创建需要加载的服务列表,如果多个Svchost.exe同时运行,则表明当前有多组服务处于活动状态;多个DLL文件正在调用它。 2. 常见系统进程解释 system process 进程文件: system process 进程名称: Windows内存处理系统进程 描述: Windows页面内存管理进程,拥有0级优先。 是否为系统进程: 是 alg.exe 进程文件: alg or alg.exe 进程名称: 应用层网关服务 描述:

趣谈Linux操作系统学习笔记:第二十四讲

我们两清 提交于 2020-11-14 06:52:26
一、小内存的分配基础 1、kmem_cache_alloc_node的作用 通过这段代码可以看出,它调用了kmem_cache_alloc_node函数,在task_struct的缓存区域task_struct分配了一块内存 static struct kmem_cache *task_struct_cachep; task_struct_cachep = kmem_cache_create("task_struct", arch_task_struct_size, align, SLAB_PANIC|SLAB_NOTRACK|SLAB_ACCOUNT, NULL); static inline struct task_struct *alloc_task_struct_node(int node) { return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node); } static inline void free_task_struct(struct task_struct *tsk) { kmem_cache_free(task_struct_cachep, tsk); } 1、在系统初始化的时候,task_struct_cachep 会被 kmem_cache_create 函数创建。 2

Linux Block子系统——IO调度层

徘徊边缘 提交于 2020-05-09 21:43:14
概述 本文主要来讨论Linux Block子系统中的IO调度层。我们知道应用层发起磁盘数据访问时内核并不会立即将请求下发到磁盘的驱动程序中进行响应,而是做适当的延迟,尝试能否扩展之前请求的磁盘范围来满足该请求。这样做的好处也很明显,以机械硬盘为例,访问不同位置的数据是通过磁头的移动实现的,如果下发给驱动程序的请求是按照磁头移动的方向进行了排序,那么磁盘只需要按照特定的方向连续的访问数据即可响应这些请求,节省了磁头移动定位的时间。对IO请求进行排序和并就是IO调度层的主要工作,由于这种机制很像我们显示生活中的电梯(只朝着一个方向运行),因此IO调度层所使用的算法也被统称为电梯调度算法。 数据结构 IO调度层涉及到的数据结构主要为两种,request表示IO请求,由通用块层的bio初始化或者合并得到;request_queue表示请求队列,包含了对一个块设备的所有request。下面我们来看一下这两种数据结构中主要的成员。 struct request { #ifdef __GENKSYMS__ union { struct list_head queuelist; struct llist_node ll_list; }; #else struct list_head queuelist; #endif union { struct call_single_data csd; RH

对于Linux内核执行过程的理解(基于fork、execve、schedule等函数)

亡梦爱人 提交于 2020-05-03 21:46:45
382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一、实验环境   win10 -> VMware -> Ubuntu16.04 + GDB -> QEMU -> linux-3.9.4 + MenuOS 二、实验目的   1、理解Linux内核中创建一个进程的过程;   2、理解Linux内核加载可执行程序的过程;   3、理解Linux内核中的进程调度时机以及进程切换过程。 三、实验过程及结果   1、对于Linux内核中进程创建过程的理解    对于每个进程来说,都有其对应的进程控制块(PCB),在内核文件中,对于PCB结构体【task_struct】的定义比较复杂,包含的参数众多,这里就不详细进行解读【具体的定义存放于:/linux-3.9.4/inlude/sched.h】,一般情况下进程控制块中的信息都会包含进程状态、进程堆栈栈顶指针、进程唯一标识符、进程相关的链表指针等信息。    接下来是基于fork函数来理解内核的进程创建过程。进程的创建,大体上是将父进程的信息复制给子进程,子进程再对一些参数进行针对性的修改。如果想要创建一个进程的话,大致可以通过四种方式进行创建,分别是fork、vfork、clone三个系统调用和keinel_thread内核函数,但是这四种方式最终都是通过调用do

Linux内核设计与实现 总结笔记(第三章)进程

无人久伴 提交于 2020-04-28 02:52:21
进程管理 进程:处于执行期的程序。 线程:在进程中活动的对象 虚拟机制 虚拟处理器:多个进程分享一个处理器 虚拟内存:多个线程共享虚拟内存 一、进程描述符和任务结构 进程存放在双向循环链表中(队列),链表中的项为task_struct,称为进程描述符。在头文件<linux/sched.h>中。 struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void * stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; #ifdef CONFIG_SMP struct task_struct * wake_entry; int on_cpu; #endif int on_rq; int prio, static_prio, normal_prio; unsigned int rt_priority; const struct sched_class * sched_class; struct sched_entity se; struct sched_rt_entity rt; #ifdef CONFIG_PREEMPT

漫谈LiteOS之开发板-LiteOS移植(基于GD32450i-EVAL)

柔情痞子 提交于 2020-04-24 13:33:04
1 为什么移植? 嵌入式设备的芯片型号和外设的差异较大,资源有限。而RTOS无法适配集成所有的驱动,因此会先适配部分开发板,然后通过移植使得适配更多的开发板。 可移植性是嵌入式操作系统与普通操作系统的显著区别之一,而所谓移植就是通过一定的代码修改使得该操作系统适配自己的开发板,以使得自己的开发板可以运行一些手头开发板没有配套的编译工程。 2 移植的分类 移植通常分为系统移植和驱动移植,驱动移植需要依赖具体的外设,本文主要介绍操作系统的移植。采用的主要方案是硬中断接管和不接管中断中的更加简便快捷的不接管中断方式。 3 开发环境 软件环境:Windows系统、Keil5、J-Link对应驱动; 硬件环境:GD32450i-EVAL开发板、J-Link下载器、串口线、数据线; 注意:上述环境也可根据自己需求进行修改,如使用IAR、GCC等。 4 移植流程 4.1 准备工作 (1)下载LiteOS源码 在github上下载最新的LiteOS源码,地址: https://github.com/LiteOS/LiteOS ,下载任意版本皆可,其源码核心一致,我这里使用的是dev-deserted,其工程目录详情如图1所示。 图1 LiteOS源码工程目录以及对应描述 (2)提取LiteOS核心移植文件 对LiteOS源码做一个简单的提取便于后续操作的简洁性,当然也可以不提取

(多核DSP快速入门)SYS/BIOS入门

ⅰ亾dé卋堺 提交于 2020-04-24 03:02:41
(多核DSP快速入门)SYS/BIOS入门 原创文章 转载请注册来源 http://blog.csdn.net/tostq 系列教程目录: http://blog.csdn.net/tostq/article/details/51245979 SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度地减少对内存和CPU的要求。其 拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。 SYS/BIOS的早期版本是DSP/BIOS,更名的原因,是因为SYS/BIOS不仅可以用于DSP,而且也可以嵌入到ARM等其他SoC中去。 SYS/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。同时也提供标准的API接口,易于使用。它是TI的eXpressDSP实时软件技术的的一个关键部分。 CCS中集成安装了SYS/BIOS ,能够大大方便用户编写多任务应用程序。另一方面,SYS/BIOS可以在XDCtools中使用配置技术

进程调度之7:need_resched与强制调度

心已入冬 提交于 2019-12-09 14:29:03
date: 2014-11-02 13:16 在《进程的调度与切换》一节中,我们提到,强制调度的两个条件: 调度时机:系统调用返回到用户空间前夕,以及中断或者异常服务程序返回到用户空间前夕。可能会有人担心如下两种情况:其一如果进程“躲在”“安全地带”内核空间中不出来,调度器岂不只能干着急?好在内核的设计与实现避免了这个问题。其二:如果进程在用户空间运行,既不调用系统调用函数,也没有中断与异常发生,岂不是也无法进行强转调度?别忘了,系统的时钟中断在默默地坚守着哩。 必要条件:当前进程的need_resched字段必须非0。该字段必须由内核去设置,为了让调度器有效运转起来,内核必须“瞅准时机”“见缝插针”地设置该字段。设置的时机包括: 其一:在时钟中断服务程序中,当发现当前进程连续运行太长时间时; 其二:当唤醒一个睡眠中的进程,发现被唤醒的进程比当前进程更有资格运行时; 其三:一个进程通过系统调用改变调度政策(sched_setscheduler)或表示礼让(sched_yield)时。这种情况实际上应该被视为主动的、自愿的调度,因为这些系统调用在返回用户空间时会引起立即调度(而上面两种情况只是设置好了need_resched字段,至于何时能有“调度时机”还是个未知数)。 1 时钟中断 时钟中断服务程序do_timer_interrupt()中调用do_timer()